(function() {

this.pasta = this.pasta || {};
this.pasta.serviceio = this.pasta.serviceio || {};

this.pasta.serviceio._systemCurrCID = 0;

this.pasta.serviceio.objList = new pasta.util.MapList();

this.pasta.serviceio.RemoteObject = Class.extend(
{
	init : function(url) 
	{
		pasta.serviceio._systemCurrCID++;
		this.cid = pasta.serviceio._systemCurrCID;
		
		pasta.serviceio.objList.set(this.cid, this);
		
		this.socket = io.connect(url);
		
		var target = this;
		var socket = this.socket;
		
		this.socket.on('connect', function () 
		{
			target.doConnect();
			
			socket.on('message', function (msg) 
			{
				target.translateMsg(msg);
			});
		});
	},
	
	call : function() 
	{
		var msg = new Object();
		
		msg["cid"] = this.cid;
		
		for (var i = 0; i < arguments.length; i++)
		{
			if (i == 0)
				msg["method"] = arguments[i];
			else
				msg["p" + i] = arguments[i];
		}
		
		this.socket.send(JSON.stringify(msg));
	},
	
	doConnect : function()
	{
		if (this._onConnect != null)
			this._onConnect.callHandler(this);
	},
	
	translateMsg : function(data)
	{
		var msg = JSON.parse(data);
		
		var obj = pasta.serviceio.objList.get(msg["cid"]);
		
		if (obj != null)
			obj.doMessage(msg);
	},
	
	doMessage : function(msg)
	{
		var funcName = msg["method"];
		funcName = "_on" + funcName.substr(0, 1).toUpperCase() +  funcName.substr(1);
		
		var func = this[funcName];
		
		if (func != undefined)
			func.callHandler(this, msg["result"]);
	},
	
	//------------------- Evnet Handler --------------
	
	getOnConnect : function()
	{
		if (this._onConnect == null)
			this._onConnect = new pasta.util.EventObj();
		
		return this._onConnect;
	},	
});

})();